
import java.io.*;
import java.net.*;
import java.security.Provider;
import java.util.*;
import nanoxml.XMLElement;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author marduke
 */
public class Servidor {

    static int DEFAULT = 1800;
    ServerSocket providerSocket;
    Socket connection = null;
    ObjectOutputStream out;
    ObjectInputStream in;
    String message;
    int puerto = 2004;
    Vector<String> vecinos = new Vector();
    Vector<String> archivos = new Vector();
    String dirArchivos;

    Servidor() {
    }

    Servidor(int puerto, Vector vecinos, Vector archivos, String dirArchivos) {
        this.puerto = puerto;
        this.vecinos = vecinos;
        this.archivos = archivos;
        this.dirArchivos = dirArchivos;
    }

    void run() throws Exception {
        try {

            //1. creating a server socket
            providerSocket = new ServerSocket(puerto, 10);
            //2. Wait for connection
            InetAddress serverAddr = InetAddress.getLocalHost();
            System.out.println("Esperenado por una conexion, Soy el servidor cliente, con hostAddress " + serverAddr.getHostAddress());
            connection = providerSocket.accept();
            System.out.println("La conexion se recibio desde: " + connection.getInetAddress().getHostName());
            //3. get Input and Output streams
            out = new ObjectOutputStream(connection.getOutputStream());
            out.flush();
            in = new ObjectInputStream(connection.getInputStream());
            sendMessage("Conexion Realizada con exito");
            //4. The two parts communicate via the input and output streams
            do {
                try {
                    message = (String) in.readObject();

                    System.out.println(message);
                    Scanner sc = new Scanner(message);

                    if (sc.hasNext()) {
                        String tmp = sc.next();

                        if (tmp.compareTo("Consulta") == 0) {
                            String arg1 = sc.next();
                            String arg2 = sc.nextLine();
                            System.out.println(arg2);
                            XMLElement xml = new XMLElement();
                            xml.setName("consulta");

                            XMLElement visitados = new XMLElement();
                            visitados.setName("visitados");

                            InetAddress addr = InetAddress.getLocalHost();
                           ClienteNodo cliente = new ClienteNodo("Consulta " +arg1+ " " +arg2+ "%-XCTW-%" +xml.toString() + "%-XCTW-%" +visitados.toString(), addr.getHostAddress());
                           String laconsulta = cliente.run();
                           String tmp2[] = laconsulta.split("%-XCTW-%");
                           System.out.println("server> La consulta fue: "+tmp2[0]);

                            //deberia leer los demas parametros y mandarlo a la funcion consulta
                            //consulta(dirArchivos, arg1, arg2);
                           
                        } else if (tmp.compareTo("Solicitiud") == 0) {

                            //deberia leer los demas parametros y mandarlos a la funcion consulta
                            String arg1 = sc.next();
                            String arg2 = sc.next();

                            solicitud(arg1, arg2);
                            System.out.println("server> Es una Solicitud");
                        } else if (tmp.compareTo("Alcanzables") == 0) {
                            //deberia mandarlo a la funcion alcanzable
                            // alcanzable(vecinos);
                            XMLElement visitados = new XMLElement();
                            visitados.setName("visitados");


                            InetAddress addr = InetAddress.getLocalHost();
                            ClienteNodo cliente = new ClienteNodo("Alcanzable " + visitados.toString(), addr.getHostName());
                            String Alcanzables = cliente.run();
                            System.out.println("server> Es alcanzables");
                            sendMessage(Alcanzables);
                        } else if (message.equals("bye")) {
                            sendMessage("bye");
                        } else {
                            System.out.println("server> Ahi un error en el protocolo");
                        }
                    }
                } catch (ClassNotFoundException classnot) {
                    System.err.println("Data received in unknown format");
                }
            } while (!message.equals("bye"));
        } catch (BindException bindExc) {
            System.err.println("Ya existe un programa corriende en ese puerto.");
            System.exit(4);

        } catch (IOException ioException) {
            ioException.printStackTrace();
        } finally {
            //4: Closing connection
            try {
                in.close();
                out.close();
                providerSocket.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }

        }

    }

    void sendMessage(String msg) {
        try {
            out.writeObject(msg);
            out.flush();
            System.out.println("server>" + msg);
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }

    }

    void consulta(String dirArchivos, String tipo, String cadena) throws Exception {
        Iterator<String> ite = archivos.iterator();
        while (ite.hasNext()) {
            String npi = (String) ite.next();
            consultaXML(dirArchivos,npi, tipo, cadena);
        }

    }

    private void consultaXML(String dirArchivo, String archivo, String tipo, String cadena) throws Exception {
        try {

            String autor = "";
            String titulo  = "";
            String descripcion  = "";

            XMLElement xml = new XMLElement();
            FileReader reader = new FileReader(dirArchivo + "/" + archivo  + ".xml");
            xml.parseFromReader(reader);


            Enumeration children = xml.enumerateChildren();
            if (tipo.compareTo("clave") == 0) {
                while (children.hasMoreElements()) {
                    XMLElement child = (XMLElement) children.nextElement();
                    if (child.getName().compareTo("palabrasClave") == 0) {
                        Enumeration children2 = child.enumerateChildren();
                        while (children2.hasMoreElements()) {
                            XMLElement child2 = (XMLElement) children2.nextElement();
                            System.out.println(child2.getAttribute("palabra"));
                            if (((String) child2.getAttribute("palabra")).contains(cadena)) {
                                Enumeration children3 = xml.enumerateChildren();
                                XMLElement child3 = (XMLElement) children.nextElement();
                                if (child.getName().compareTo("titulo") == 0) {
                                    titulo = child.getContent();
                                    System.out.println(titulo);
                                }else if (child.getName().compareTo("descripcion") == 0) {
                                    descripcion = child.getContent();
                                    System.out.println(descripcion);
                                }else if (child.getName().compareTo("autor") == 0) {
                                    autor = child.getContent();
                                    System.out.println(autor);
                                }
                                enviarConsulta(archivo+".jpg", titulo, autor, descripcion);
                            }
                        }
                    }
                }
            } else {

                while (children.hasMoreElements()) {
                    XMLElement child = (XMLElement) children.nextElement();
                    if (child.getName().compareTo("titulo") == 0) {
                        if (((String) child.getContent()).contains(cadena)) {
                            Enumeration children3 = xml.enumerateChildren();
                            XMLElement child3 = (XMLElement) children.nextElement();
                            if (child.getName().compareTo("titulo") == 0) {
                                titulo = child.getContent();
                                System.out.println(titulo);
                            }else if (child.getName().compareTo("descripcion") == 0) {
                                descripcion = child.getContent();
                                System.out.println(descripcion);
                            }else if (child.getName().compareTo("autor") == 0) {
                                autor = child.getContent();
                                System.out.println(autor);
                            }
                            enviarConsulta(archivo+".jpg", titulo, autor, descripcion);
                        }
                    }
                }
            }
        } catch (Exception e) {
        }
    }

    private void enviarConsulta(String nombreArchivo, String titulo, String autor, String descripcion) throws Exception {
        XMLElement consulta = new XMLElement();
        consulta.setName("maquina");

        InetAddress adr = InetAddress.getLocalHost();

        consulta.setAttribute("hostname", adr.getHostAddress());

        XMLElement child = new XMLElement();
        child.setName("foto");

        child.setAttribute("nombreArchivo", nombreArchivo);
        child.setAttribute("autor", autor);
        child.setAttribute("titulo", titulo);
        child.setAttribute("descripcion", descripcion);

        consulta.addChild(child);

        
    }

    void solicitud(String archivo, String maquina) {
    }

    private void getIp() {
        try {
            InetAddress addr = providerSocket.getInetAddress();

            // Get IP Address
            byte[] ipAddr = addr.getAddress();
            String ipAdd = ipAddr[0] + "." + ipAddr[1] + "." + ipAddr[2] + "." + ipAddr[3] + ".";

            System.out.println(ipAdd);

            // Get hostname
            String hostname = addr.getHostName();
            System.out.println(hostname);
        } catch (Exception e) {
        }
    }

    static String getTitulo(String FileXML) throws Exception {

        XMLElement xml = new XMLElement();
        boolean conseguido = false;
        String retorno = "No se consigio";
        FileReader reader = new FileReader(FileXML);
        xml.parseFromReader(reader);

        Enumeration children = xml.enumerateChildren();
        while (children.hasMoreElements()) {
            XMLElement child = (XMLElement) children.nextElement();
            if (child.getName().compareTo("titulo") == 0) {
                retorno = child.getContent();
            }

        }

        return retorno;
    }

    static String getClaves(String FileXML) throws Exception {

        XMLElement xml = new XMLElement();
        boolean conseguido = false;
        String retorno = "No se consiguio";
        FileReader reader = new FileReader(FileXML);
        xml.parseFromReader(reader);



        Enumeration children = xml.enumerateChildren();
        while (children.hasMoreElements()) {
            XMLElement child = (XMLElement) children.nextElement();
            if (child.getName().compareTo("titulo") == 0) {
                retorno = child.getContent();
            }

        }

        return retorno;
    }
}
